package com.atdel.demo24;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Date;

/**
 * @BelongsProject: java_study
 * @BelongsPackage: com.atdel.demo24
 * @Author: Del
 * @CreateTime: 2025-03-21  09:33
 * @Description: 用于在不同时间类型和数字类型之间进行转换的枚举类
 * @Version: 1.0
 */
public enum ValueConverter {

    // 将Date类型转换为LocalDate类型的转换器
    DATE_TO_LOCAL_DATE {
        @Override
        public boolean supports(Class<?> fieldType, Object value) {
            // 判断字段类型是否为LocalDate，且值是否为Date类型
            return fieldType == LocalDate.class && value instanceof Date;
        }

        @Override
        public Object convert(Object value) {
            // 将Date类型转换为LocalDate类型
            return ((Date) value).toInstant()
                    .atZone(ZoneId.systemDefault())
                    .toLocalDate();
        }
    },
    // 将Date类型转换为LocalTime类型的转换器
    DATE_TO_LOCAL_TIME {
        @Override
        public boolean supports(Class<?> fieldType, Object value) {
            // 判断字段类型是否为LocalTime，且值是否为Date类型
            return fieldType == LocalTime.class && value instanceof Date;
        }

        @Override
        public Object convert(Object value) {
            // 将Date类型转换为LocalTime类型
            return ((Date) value).toInstant()
                    .atZone(ZoneId.systemDefault())
                    .toLocalTime();
        }
    },
    // 将Date类型转换为LocalDateTime类型的转换器
    DATE_TO_LOCAL_DATE_TIME {
        @Override
        public boolean supports(Class<?> fieldType, Object value) {
            // 判断字段类型是否为LocalDateTime，且值是否为Date类型
            return fieldType == LocalDateTime.class && value instanceof Date;
        }

        @Override
        public Object convert(Object value) {
            // 将Date类型转换为LocalDateTime类型
            return ((Date) value).toInstant()
                    .atZone(ZoneId.systemDefault())
                    .toLocalDateTime();
        }
    },
    // 将LocalDate类型转换为Date类型的转换器
    LOCAL_DATE_TO_DATE {
        @Override
        public boolean supports(Class<?> fieldType, Object value) {
            // 判断字段类型是否为Date，且值是否为LocalDate类型
            return fieldType == Date.class && value instanceof LocalDate;
        }

        @Override
        public Object convert(Object value) {
            // 将LocalDate类型转换为Date类型
            return Date.from(((LocalDate) value).atStartOfDay(ZoneId.systemDefault()).toInstant());
        }
    },
    // 将LocalTime类型转换为Date类型的转换器
    LOCAL_TIME_TO_DATE {
        @Override
        public boolean supports(Class<?> fieldType, Object value) {
            // 判断字段类型是否为Date，且值是否为LocalTime类型
            return fieldType == Date.class && value instanceof LocalTime;
        }

        @Override
        public Object convert(Object value) {
            // 将LocalTime类型转换为Date类型
            return Date.from(((LocalTime) value).atDate(LocalDate.now()).atZone(ZoneId.systemDefault()).toInstant());
        }
    },
    // 将LocalDateTime类型转换为Date类型的转换器
    LOCAL_DATE_TIME_TO_DATE {
        @Override
        public boolean supports(Class<?> fieldType, Object value) {
            // 判断字段类型是否为Date，且值是否为LocalDateTime类型
            return fieldType == Date.class && value instanceof LocalDateTime;
        }

        @Override
        public Object convert(Object value) {
            // 将LocalDateTime类型转换为Date类型
            return Date.from(((LocalDateTime) value).atZone(ZoneId.systemDefault()).toInstant());
        }
    },
    // 将Number类型转换为int类型的转换器
    NUMBER_TO_INT {
        @Override
        public boolean supports(Class<?> fieldType, Object value) {
            // 判断字段类型是否为int，且值是否为Number类型
            return fieldType == int.class && value instanceof Number;
        }

        @Override
        public Object convert(Object value) {
            // 将Number类型转换为int类型
            return ((Number) value).intValue();
        }
    },
    // 将Number类型转换为long类型的转换器
    NUMBER_TO_LONG {
        @Override
        public boolean supports(Class<?> fieldType, Object value) {
            // 判断字段类型是否为long，且值是否为Number类型
            return fieldType == long.class && value instanceof Number;
        }

        @Override
        public Object convert(Object value) {
            // 将Number类型转换为long类型
            return ((Number) value).longValue();
        }
    },
    // 将Number类型转换为double类型的转换器
    NUMBER_TO_DOUBLE {
        @Override
        public boolean supports(Class<?> fieldType, Object value) {
            // 判断字段类型是否为double，且值是否为Number类型
            return fieldType == double.class && value instanceof Number;
        }

        @Override
        public Object convert(Object value) {
            // 将Number类型转换为double类型
            return ((Number) value).doubleValue();
        }
    },
    // 将String类型转换为boolean类型的转换器
    STRING_TO_BOOLEAN {
        @Override
        public boolean supports(Class<?> fieldType, Object value) {
            // 判断字段类型是否为boolean，且值是否为String类型
            return fieldType == boolean.class && value instanceof String;
        }

        @Override
        public Object convert(Object value) {
            // 将String类型转换为boolean类型
            return Boolean.parseBoolean((String) value);
        }
    },
    // 将BigDecimal类型转换为Double类型的转换器
    BIG_DECIMAL_TO_DOUBLE {
        @Override
        public boolean supports(Class<?> fieldType, Object value) {
            // 判断字段类型是否为Double，且值是否为BigDecimal类型
            return fieldType == Double.class && value instanceof BigDecimal;
        }

        @Override
        public Object convert(Object value) {
            // 将BigDecimal类型转换为Double类型
            return ((BigDecimal) value).doubleValue();
        }
    };

    // 抽象方法：判断是否支持该类型转换
    public abstract boolean supports(Class<?> fieldType, Object value);

    // 抽象方法：执行转换
    public abstract Object convert(Object value);
}
